FSYNC(2) | Linux Programmer's Manual | FSYNC(2) |
名前¶
fsync - メモリ上にあるファイルの内容をストレージデバイス上のものと同期させる
書式¶
#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);
glibc
向けの機能検査マクロの要件
(feature_test_macros(7) 参照):
fsync(): _BSD_SOURCE || _XOPEN_SOURCE
|| /* glibc 2.8 以降では: */
_POSIX_C_SOURCE >= 200112L
fdatasync(): _POSIX_C_SOURCE >= 199309L ||
_XOPEN_SOURCE >= 500
説明¶
fsync() は、ファイル記述子 fd で参照されるファイルの内部で持っているデータ (つまりバッファキャッシュページ) のうち修正されたデータを、 そのファイルが属するディスクデバイス (またはその他の永続ストレージデバイス) に転送 (「フラッシュ」) する。 この呼び出しは転送が終わったとデバイスが報告するまでブロックする。 またファイルに結びついたメタデータ情報 (stat(2) 参照) もフラッシュする。
fsync() の呼び出しは、ファイルが存在しているディレクトリのエントリがディスクへ 書き込まれたことを保証するわけではない。 保証するためには明示的にそのディレクトリのファイル記述子に対しても fsync() する必要がある。
fdatasync() は fsync() と同様であるが、メタデータの扱いが異なる。 fdatasync() は、それ以降のデータ読み込みを正しく扱うためにそのメタデータが必要に ならない限り、変更されたメタデータをフラッシュしない。 例えば、 st_atime や st_mtime (それぞれ最終アクセス時刻、最終修正時刻; stat(2) 参照) の変更はフラッシュを必要としない。 なぜならこれらはそれ以降のデータ読み込みを正しく扱うために 必要ではないからである。 一方、ファイルサイズ (ftruncate(2) では st_size) の変更はメタデータのフラッシュが必要である。 fdatasync() の狙いは、全てのメタデータをディスクと同期する必要のない アプリケーションに対して、ディスクアクセスを減らすことである。
返り値¶
成功した場合、これらのシステムコールはゼロを返す。 エラーの場合、-1 が返され、 errno が適切に設定される。
エラー¶
- EBADF
- fd が書き込みのためにオープンされたファイル記述子でない。
- EIO
- 同期操作の間にエラーが発生した。
- EROFS, EINVAL
- fd が同期操作をサポートしてない特殊なファイルを参照している。
準拠¶
4.3BSD, POSIX.1-2001.
可用性¶
fdatasync() が利用可能な POSIX システムでは、 _POSIX_SYNCHRONIZED_IO が <unistd.h> で 0 より大きな値に定義される (sysconf(3) 参照)。
注意¶
データベースやログファイルにアクセスするアプリケーションは、 非常に小さなデータの断片の書き込みを行い、その後すぐに fsync() を呼び出して、書き込んだデータがハードディスクに物理的に 確実に格納されるようにすることが多い。 残念ながら、 fsync() は常に 2つの書き込み操作を開始する。 一つは新しく書き込まれたデータに対するものであり、 もう一つは inode に格納される修正時刻 (modification time) を 更新するためのものである。 修正時刻の更新が不可分な操作 (トランザクション) の一部ではない場合、 fdatasync() を使うことで、不必要な inode のディスク書き込み操作を避けることができる。
データが配置されているハードディスクの書き込みキャッシュが有効に なっている場合、 fsync() / fdatasync() から戻ってきたとしても、そのデータは実際には永続的な記憶媒体に 格納されていないかもしれない。
ext2 ファイル・システムが sync オプションつきでマウントされている場合、 fsync() でディレクトリ・エントリも暗黙のうちに同期する。
2.4 より前のカーネルでは巨大なファイルに fsync() を使用することは効率が悪い場合がある。 別の方法として open(2) の際に O_SYNC フラグを使用するのが良いかもしれない。
Linux 2.2 以前では、 fdatasync() は fsync() と等価であり、性能面でのメリットはない。
関連項目¶
bdflush(2), open(2), sync(2), sync_file_range(2), hdparm(8), mount(8), sync(8), update(8)
2008-11-07 | Linux |